#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 此脚本用于单独执行特定的测试用例

import os
import sys
import unittest


def load_single_test_case(case_name):
    """加载指定的单个测试用例"""
    if not os.path.exists('./testcase/' + case_name + '/case.py'):
        print(f"错误: 找不到测试用例 '{case_name}'")
        print("可用的测试用例列表:")
        # 显示所有可用的测试用例
        dir_filter = lambda x:os.path.exists('./testcase/' + x + '/case.py')
        case_list = list(filter(dir_filter, os.listdir('./testcase/')))
        for case in case_list:
            print(f"  - {case}")
        return None
    
    try:
        tmp = __import__(f'testcase.{case_name}.case')
        return eval(f'tmp.{case_name}.case')
    except Exception as e:
        print(f"加载测试用例时出错: {e}")
        return None


if __name__ == "__main__":
    # 确保在测试目录下运行
    script_path = os.path.dirname(os.path.abspath(__file__))
    os.chdir(script_path)
    
    # 添加当前目录到Python路径，以便能正确导入base_case
    sys.path.append(script_path)
    
    # 检查命令行参数
    if len(sys.argv) < 2:
        print("用法: python run_single_test.py <测试用例名称> [测试方法名]")
        print("例如: python run_single_test.py a_3_matcher_host")
        print("或者: python run_single_test.py a_3_matcher_host test_host_equal")
        sys.exit(1)
    
    case_name = sys.argv[1]
    method_name = sys.argv[2] if len(sys.argv) > 2 else None
    
    # 加载指定的测试用例
    test_case_module = load_single_test_case(case_name)
    if test_case_module is None:
        sys.exit(1)
    
    test_suite = unittest.TestSuite()
    
    if method_name:
        # 只运行特定的测试方法
        if hasattr(test_case_module.Case, method_name):
            test_suite.addTest(test_case_module.Case(method_name))
            print(f"正在运行测试用例: {case_name}, 方法: {method_name}")
        else:
            print(f"错误: 测试方法 '{method_name}' 不存在于测试用例 '{case_name}' 中")
            print("可用的测试方法:")
            # 显示该测试用例中所有以test_开头的方法
            for attr in dir(test_case_module.Case):
                if attr.startswith('test_') and callable(getattr(test_case_module.Case, attr)):
                    print(f"  - {attr}")
            sys.exit(1)
    else:
        # 运行该测试用例的所有测试方法
        test_suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(test_case_module.Case))
        print(f"正在运行测试用例: {case_name} 的所有测试方法")
    
    # 运行测试
    runner = unittest.TextTestRunner(verbosity=2)  # 增加详细度以显示更多信息
    result = runner.run(test_suite)
    
    # 分析测试结果并提供有用的建议
    if not result.wasSuccessful():
        print("\n测试失败分析:")
        
        # 根据常见的失败原因提供建议
        if any('exec_sys_cmd' in str(err) for err in result.failures + result.errors):
            print("\n看起来是系统命令执行失败了。常见原因包括:")
            print("1. 权限问题 - 尝试使用sudo运行测试")
            print("2. nginx/openresty未正确安装在/opt/verynginx/openresty目录")
            print("3. 配置文件问题")
            
        if any('init_by_lua_file error' in str(err) for err in result.failures + result.errors):
            print("\n检测到Lua初始化错误。建议:")
            print("1. 检查VeryNginx的安装状态")
            print("2. 查看/opt/verynginx/openresty/nginx/logs/error.log获取详细错误信息")
            print("3. 确保openresty版本与VeryNginx兼容")
            
        print("\n建议的解决步骤:")
        print("1. 以管理员权限运行测试: sudo python run_single_test.py <测试用例>")
        print("2. 检查VeryNginx是否正确安装: python install.py")
        print("3. 查看详细的错误日志")
    
    # 根据测试结果设置退出码
    sys.exit(0 if result.wasSuccessful() else 1)